OS. PythonでのOpenSTAADプログラムの記述
この例では、PythonでOpenSTAADアプリケーションを記述するために必要ないくつかの概念を紹介します。
OS. Geometryメソッドの使用
-
「geometry = os.Geometry」と入力し、<Enter>キーを押します。
これにより、ジオメトリ変数がOpenSTAADのGeometryグループのメソッドとして定義されます。
- 「geometry._FlagAsMethod("GetNodeCount")」と入力し、<Enter>キーを押します。 これは、PythonでOpenSTAADメソッドを正しく識別するために必要です。
- 「geometry._FlagAsMethod("GetMemberCount")」と入力し、<Enter>キーを押します。 これは、PythonでOpenSTAADメソッドを正しく識別するために必要です。
OS. 単一の値のみを返す関数の使用
-
「nodeCount = geometry.GetNodeCount」と入力し、<Enter>キーを押します。
これにより、OpenSTAADメソッドGetNodeCount()を使用して、アクティブなSTAAD.Proモデル内のノードの数が指定した変数に返されるようになります。
-
「beamCount = geometry.GetMemberCount」と入力し、<Enter>キーを押します。
同様に、OpenSTAADメソッドGetMemberCount()を使用して、アクティブなSTAAD.Proモデル内のメンバーの数が指定した変数に返されるようになります。
from comtypes import automation
from comtypes import client
import ctypes
os = client.GetActiveObject("StaadPro.OpenSTAAD")
geometry = os.Geometry
geometry._FlagAsMethod("GetNodeCount")
geometry._FlagAsMethod("GetMemberCount")
nodeCount = geometry.GetNodeCount
beamCount = geometry.GetMemberCount
OS. 値のリストのみを返す関数の使用
ここでは、値のリストを配列に格納します。
-
comptypesライブラリからインポートされたautomationクラスを使用して、異なるデータタイプで使用する複数のバリアント配列を定義します。
-
「def make_safe_array_double(size): return automation._midlSAFEARRAY(ctypes.c_double).create([0]*size)」と入力し、<Enter>キーを押します。
これにより、倍精度浮動小数点の10進数値で構成される配列タイプが定義されます。
-
「def make_safe_array_int(size): return automation._midlSAFEARRAY(ctypes.c_int).create([0]*size)」と入力し、<Enter>キーを押します。
これにより、整数で構成される配列タイプが定義されます。
-
「def make_safe_array_long(size): return automation._midlSAFEARRAY(ctypes.c_long).create([0]*size)」と入力し、<Enter>キーを押します。
これにより、長整数値で構成される配列タイプが定義されます。
-
「def make_safe_array_double(size): return automation._midlSAFEARRAY(ctypes.c_double).create([0]*size)」と入力し、<Enter>キーを押します。
-
次の文を入力します。それぞれの文の最後に<Enter>キーを押します。
def make_variant_vt_ref(obj, var_type): var = automation.VARIANT() var._.c_void_p = ctypes.addressof(obj) var.vt = var_type | automation.VT_BYREF return var
この定義により、GetBeamList()など、長い型の値のリストを返すメソッドを呼び出せるようになります。 - 「geometry._FlagAsMethod("GetBeamList")」と入力し、<Enter>キーを押します。
-
次に、この識別されたメソッドを使用して、モデル内のビームのリストを新しい配列に取り込みます。
-
「safe_array_beam_list = automation._midlSAFEARRAY(ctypes.c_long).create([0]*beamCount)」と入力し、<Enter>キーを押します。
これにより、前のbeamCountの結果を使用して配列の必要なサイズが確立されます。
-
「beams = make_variant_vt_ref(safe_array_beam_list, automation.VT_ARRAY | automation.VT_I4)」と入力し、<Enter>キーを押します。
これにより、値を格納するための適切なサイズを持つbeamsという名前の配列が作成されます。
-
「geometry.GetBeamList(beams)」と入力し、<Enter>キーを押します。
これは、新しく作成された配列beamsに戻り値を格納するために使用されます。
-
「safe_array_beam_list = automation._midlSAFEARRAY(ctypes.c_long).create([0]*beamCount)」と入力し、<Enter>キーを押します。
-
次に、前の手順と同様の方法で、解析結果の取得と使用するメソッドの識別に使用されるOpenSTAADのメソッドのグループを追加します。
-
「output = os.Output」と入力し、<Enter>キーを押します。
これにより、出力変数が解析結果の取得に使用されるOpenSTAADのOutputグループのメソッドとして定義されます。
- 「output._FlagAsMethod("GetSupportReactions")」と入力し、<Enter>キーを押します。
-
「output = os.Output」と入力し、<Enter>キーを押します。
-
次の文を入力します。それぞれの文の最後に<Enter>キーを押します。
nodeNo = 1 loadcaseNo = 1
-
次に、この識別されたメソッドを使用して、指定されたノードと荷重ケースのサポート反力を新しい配列に取り込みます。
- 「safe_array_reactions = make_safe_array_double(6)」と入力し、<Enter>キーを押します。 これにより、前に定義した倍精度の配列タイプを使用して固定サイズの配列が作成されます(固定サイズの6は任意のサポートにおいて取り得る反力の数です)。
- 「reactions = make_variant_vt_ref(safe_array_reactions, automation.VT_ARRAY | automation.VT_R8)」と入力し、<Enter>キーを押します。 これにより、値を格納するための適切なサイズを持つreactionsという名前の配列が作成されます。
-
「output.GetSupportReactions(nodeNo, loadcaseNo, reactions)」と入力し、<Enter>キーを押します。
このメソッドでは、最初の2つのパラメーターを入力として使用し、新しく作成された配列reactionsに戻り値を格納します。
from comtypes import automation
from comtypes import client
import ctypes
os = client.GetActiveObject("StaadPro.OpenSTAAD")
geometry = os.Geometry
geometry._FlagAsMethod("GetNodeCount")
geometry._FlagAsMethod("GetMemberCount")
nodeCount = geometry.GetNodeCount()
beamCount = geometry.GetMemberCount()
def make_safe_array_double(size):
return automation._midlSAFEARRAY(ctypes.c_double).create([0]*size)
def make_safe_array_int(size):
return automation._midlSAFEARRAY(ctypes.c_int).create([0]*size)
def make_safe_array_long(size):
return automation._midlSAFEARRAY(ctypes.c_long).create([0]*size)
def make_variant_vt_ref(obj, var_type):
var = automation.VARIANT()
var._.c_void_p = ctypes.addressof(obj)
var.vt = var_type | automation.VT_BYREF
return var
geometry._FlagAsMethod("GetBeamList")
safe_array_beam_list = automation._midlSAFEARRAY(ctypes.c_long).create([0]*beamCount)
beams = make_variant_vt_ref(safe_array_beam_list, automation.VT_ARRAY | automation.VT_I4)
geometry.GetBeamList(beams)
output = os.Output
output._FlagAsMethod("GetSupportReactions")
nodeNo = 1
loadcaseNo = 1
safe_array_reactions = make_safe_array_double(6)
reactions = make_variant_vt_ref(safe_array_reactions, automation.VT_ARRAY | automation.VT_R8)
output.GetSupportReactions(nodeNo, loadcaseNo, reactions)
OS. OpenSTAAD出力の生成
-
「print( str(nodeCount) + ' joints')」と入力し、<Enter>キーを押します。
この行では、最も内側の操作から外側に向かって、まずnodeCountに格納された数値の結果を文字列に変換しています。次に、出力が解釈しやすくなるように、その文字列をテキスト文字列「' joints'」と組み合わせています。その連結された文字列全体が端末に出力されます。
-
「print(str(beamCount) + ' members')」と入力します。
同様に、ここでは、文字列に変換されたbeamCountの値をテキストと連結し、その結果を端末に表示しています。
-
モデル内のビーム番号を出力するには、次の文を入力します。それぞれの文の最後に<Enter>キーを押します。
print("Beam Numbers") for beam in beams: print(beam)
これは、"for"ループを使用して、beamsという名前の配列内に各ビーム番号を出力します。
-
荷重ケース1のノード1のサポート反力値を出力するには、次の文を入力します。それぞれの文の最後に<Enter>キーを押します。
print("Support Reactions") for reaction in reactions: print(reaction)
from comtypes import automation
from comtypes import client
import ctypes
os = client.GetActiveObject("StaadPro.OpenSTAAD")
geometry = os.Geometry
geometry._FlagAsMethod("GetNodeCount")
geometry._FlagAsMethod("GetMemberCount")
nodeCount = geometry.GetNodeCount()
beamCount = geometry.GetMemberCount()
def make_safe_array_double(size):
return automation._midlSAFEARRAY(ctypes.c_double).create([0]*size)
def make_safe_array_int(size):
return automation._midlSAFEARRAY(ctypes.c_int).create([0]*size)
def make_safe_array_long(size):
return automation._midlSAFEARRAY(ctypes.c_long).create([0]*size)
def make_variant_vt_ref(obj, var_type):
var = automation.VARIANT()
var._.c_void_p = ctypes.addressof(obj)
var.vt = var_type | automation.VT_BYREF
return var
geometry._FlagAsMethod("GetBeamList")
safe_array_beam_list = automation._midlSAFEARRAY(ctypes.c_long).create([0]*beamCount)
beams = make_variant_vt_ref(safe_array_beam_list, automation.VT_ARRAY | automation.VT_I4)
geometry.GetBeamList(beams)
output = os.Output
output._FlagAsMethod("GetSupportReactions")
nodeNo = 1
loadcaseNo = 1
safe_array_reactions = make_safe_array_double(6)
reactions = make_variant_vt_ref(safe_array_reactions, automation.VT_ARRAY | automation.VT_R8)
output.GetSupportReactions(nodeNo, loadcaseNo, reactions)
print(str(nodeCount) + ' joints')
print(str(beamCount) + ' members')
print("Beam Numbers")
for beam in beams:
print(beam)
print("Support Reactions")
for reaction in reactions:
print(reaction)
OS. うまくいかない場合の対応
まだ行っていない場合は、リンターをインストールしてください。これにより、Pythonプログラムに関する有用なフィードバックと、コードを最適化するための役立つヒントが提供されます。
また、IDEにより、コードで検出された問題に関するフィードバックが提供されます。ワードプロセッサのスペルチェックや文法チェックと同じように、コードを実行する前にエラーの通知を受け取ることができます。
Pythonインタープリタ(Python v3.8.n)とpywin32拡張機能を含む完全な環境が設定されていること、およびSTAAD.Proでモデルが開いていることを確認します。STAAD.Proにアクティブなモデルがあることは、すべてのSTAAD.Proプログラムで必須というわけではありませんが、この特定のプログラムでは必要です。
Visual Studio Codeのデバッグツールを使用すると、コードの解釈を"ステップ"単位で進めて問題を特定することができます。メインコードウィンドウで行番号の左側をクリックすると、ブレークポイントが追加されます。次に、「実行」タブを選択します(または<Ctrl+Shift+D>キーを押します)。「実行とデバッグ」ボタンをクリックしてプロセスを開始します。ターミナルでのプログラムの実行に合わせて追加情報が提供され、各ブレークポイントで一時停止します。
このエディタでのデバッグ機能の使用に関する詳細については、Visual Studio Codeコードのヘルプを参照してください。